<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

</body>
<script>
    // 对比普通函数和构造函数发现: 

    // String(100);
    // Boolean(100);
    // Number("100");

    // var str = new String("100");
    // console.log(str);

    // var arr = new Array(1, 2, 3);
    // console.log(arr);
    // console.log(arr instanceof Array);

    // var obj = new Object();
    // console.log(obj instanceof Object);

    // var p = new Promise(function () { })
    // console.log(p instanceof p);


    // new关键词做了什么操作?
    // 1. 创建一个新的实例化对象  {}
    // 2. 给所有的实例化对象性绑定原型属性[[Prototype]](新版本) / __proto__(老版本)  => 指向构造函数的原型对象 (=> 所有的实例化对象可以访问构造函数的原型镀锡)
    // 3. 将this指向被创建的实例化对象 this->{}
    // 4. 函数执行结束 默认返回被创建的实例化对象

    // 注意: 
    // 1. 每次调用构造函数 都会创建新的实例化对象,并执行构造函数的上下文 (我们要做的就是将需要的属性和方法绑定到实例化对象)
    // 2. 为了区分普通函数和构造函数 => 要求构造函数首字母大写

    function Fn() {
        // {}
        // this-> {}

        console.log(this, this instanceof Fn);  // this -> {} => 构造函数Fn创建的空对象
        // 我们要做的就是将需要的属性和方法绑定到实例化对象
        // this.a = 1;
        // this.b = 2;

        // return this;
    }

    // 作为普通函数调用
    // var result = Fn(); // this -> window
    // console.log(result);

    // 作为构造函数调用

    var result = new Fn();  // 调用构造函数 创建一个新的实例化对象 赋值给变量result
    console.log(result);  // {}

    var result1 = new Fn();  // 调用构造函数 创建一个新的实例化对象 赋值给变量result
    console.log(result1);

    console.log(result == result1);  // {}


    String("1111")
    Boolean(1111);

    new String("1111")
    new Boolean(1111);



</script>

</html>